/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package robot_maker;

import Excepciones.DinamicaDato;
import Modelo.BaseDato;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import Excepciones.ClienteException;
import Excepciones.ProcesamientoDato;
import Excepciones.Sistema;

/** La clase Cliente se encarga de almacenar los clientes necesarios para
 *  la compra y venta de robots y accesorios.
 *
 * @author CarlosScipione
 */
public class Cliente {
    private int _ciRif;
    private String _nombre;
    private String _apellido;
    private long _telefono;
    private char _sexo;
    private String _estadoCivil;
    private String _estado;
    private String _calle;



    /** Construye el objeto cliente
     *
     * @param ciRif
     * @param nombre
     * @param apellido
     * @param telefono
     * @param sexo
     * @param estadoCivil
     * @param estado
     * @param calle
     * @throws ClienteException
     */
    public Cliente (String ciRif, String nombre, String apellido,
            String telefono, char sexo, String estadoCivil, String estado,
            String calle) throws ClienteException{
   if ((nombre.isEmpty()) || (apellido.isEmpty())
        || (calle.isEmpty()) || (Integer.parseInt(ciRif) == 0)
        || (telefono.replace("-", "").isEmpty()) ||
        (Integer.parseInt(ciRif) < 0)){
               JOptionPane.showMessageDialog(null,
                    "Ningun campo debe ser vacio.");
               throw new ClienteException(3, "CAMPOS DATOS CLIENTE VACIOS",
                       "CONSTRUCTOR");
       }else{

        _ciRif = Integer.parseInt(ciRif);
        _nombre = nombre.toUpperCase();
        _apellido = apellido.toUpperCase();
        _telefono = Long.parseLong(telefono.replace("-", ""));
        _sexo = sexo;
        _estadoCivil = estadoCivil;
        _estado = estado;
        _calle = calle.toUpperCase();
       }
    }
/** Construye el objeto cliente sin parametros
 *
 */
    public Cliente() {

    }
    
 

  /**  Registra un cliente en la base de datos
   *
   * @param nuevo
   * @throws BasesdeDatos
   * @throws ClienteException
   */
   public void ingresarBD (Cliente nuevo) throws ClienteException,
           ProcesamientoDato{

        if(validarExistencia(nuevo.getCiRif()))

        try {
            BaseDato.ejecutarSqlInsert("insert into CLIENTE (ciRif, nombre," +
                    " apellido, telefono, sexo, estado_civil, estado, calle" +
                    ") values (" + nuevo.getCiRif() + ",'" + nuevo._nombre +
                    "','" + nuevo._apellido + "'," + nuevo._telefono + ",'" +
                    nuevo._sexo + "','" + nuevo._estadoCivil + "','" +
                    nuevo._estado + "','" + nuevo._calle + "')");
        } catch (DinamicaDato ex) {
                throw new ProcesamientoDato(1,
               "NO SE PUDO PROCESAR DATOS FOR FALTA DE LOS MISMOS",
               "EJECUTARSQLSELECT");        }
        

    }


    /** Validar que no exita un cliente con la misma cedula
     *
     * @param ci
     * @return Boolean
     * @throws ClienteException
     */
      public Boolean validarExistencia(int ci) throws ClienteException,
              ProcesamientoDato{
        try {
            ResultSet lista = null;
            lista = BaseDato.ejecutarSqlSelect("select COUNT(*) from CLIENTE "
                    + "where cirif=" + ci);

                lista.next();
                if (lista.getString(1).equals("0")) {
                    return true;
                } else {
                    JOptionPane.showMessageDialog(null, "Esa C.I. ya existe.");
                    throw new ClienteException(12,
                            "LA C.I. YA EXISTE EN LA BASE DE DATOS",
                            "VALIDAREXISTENCIA");
                }
            
        } catch (DinamicaDato ex) {
                throw new ProcesamientoDato(1,
               "NO SE PUDO PROCESAR DATOS FOR FALTA DE LOS MISMOS",
               "EJECUTARSQLSELECT");
        } catch (Exception ex) {
                Sistema.loggear(11, "validarExistencia",
                        "EN EL SQL DE EJECUCION", Cliente.class,
                        "SQLException");
            }
                    return false;

      }

    /**
     * Método que se encarga de devuelve las variables del rif
     * @return int
     */
    public int getCiRif() {
        return _ciRif;
    }


    /** Modifica los datos de un cliente en la base de datos
     *
     * @param nuevo
     * @param ciOld
     * @throws BasesdeDatos
     * @throws ClienteException
     */
      public void modificarBD (Cliente nuevo, int ciOld) throws 
              ClienteException, ProcesamientoDato{
         try {
          if (ciOld != nuevo.getCiRif()){
            if(validarExistencia(nuevo.getCiRif()))


                BaseDato.ejecutarSqlInsert("update CLIENTE set ciRif=" +
                        nuevo.getCiRif() + ", nombre='" + nuevo._nombre +
                        "', sexo='" + nuevo._sexo + "', telefono=" +
                        nuevo._telefono + ", apellido='" + nuevo._apellido +
                        "', estado_civil='" + nuevo._estadoCivil + "', estado='"
                        + nuevo._estado + "', calle='" + nuevo._calle +
                        "' where ciRif=" + ciOld);

         }else{

        BaseDato.ejecutarSqlInsert("update CLIENTE set"
            + " nombre='" + nuevo._nombre + "', sexo='" + nuevo._sexo +
            "', telefono=" + nuevo._telefono + ", apellido='" +
            nuevo._apellido + "', estado_civil='" +  nuevo._estadoCivil +
            "', estado='" + nuevo._estado + "', calle='" + nuevo._calle +
            "' where ciRif=" + nuevo.getCiRif());
         }
            } catch (DinamicaDato ex) {
                throw new ProcesamientoDato(1,
               "NO SE PUDO PROCESAR DATOS FOR FALTA DE LOS MISMOS",
               "EJECUTARSQLSELECT");            }
        
    }


      /** Obtiene los datos del cliente
       *
       * @param id
       * @return Cliente
       * @throws SQLException
       * @throws BasesdeDatos
       */
      public Cliente getDatos (int id) throws ProcesamientoDato{
          Cliente losa = new Cliente();
          try {
            ResultSet lista = null;
            lista = BaseDato.ejecutarSqlSelect("select * from CLIENTE where ciRif="
                    + id);
            losa._ciRif = id;
            lista.next();
            losa._nombre = lista.getString(2);
            losa._apellido = lista.getString(3);
            losa._telefono = lista.getLong(4);
            losa._sexo = lista.getString(5).charAt(0);
            losa._estadoCivil = lista.getString(6);
            losa._estado = lista.getString(7);
            losa._calle = lista.getString(8);
        } catch (DinamicaDato ex) {
                throw new ProcesamientoDato(1,
               "NO SE PUDO PROCESAR DATOS FOR FALTA DE LOS MISMOS",
               "EJECUTARSQLSELECT");
        } catch (Exception ex) {
           Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
    }
                    return losa;

      }


      /** Borra los datos del cliente de la base de datos
       *
       * @param aEliminar
       * @param n
       * @throws BasesdeDatos
       */
    public void borrarBD(int aEliminar, int n) throws ProcesamientoDato{

        if(n == 0){
            try {
                BaseDato.ejecutarSqlInsert("delete from CLIENTE where ciRif="
                        + aEliminar);
            } catch (DinamicaDato ex) {
                throw new ProcesamientoDato(1,
               "NO SE PUDO PROCESAR DATOS FOR FALTA DE LOS MISMOS",
               "EJECUTARSQLSELECT");             }
        }


    }
/** Obtiene el apellido del cliente
 *
 * @return String
 */
    public String getApellido() {
        return _apellido;
    }


/** Obtiene la calle del cliente
 *
 * @return String
 */
    public String getCalle() {
        return _calle;
    }


/** Obtiene el Estado de ubicacion del cliente
 *
 * @return String
 */
    public String getEstado() {
        return _estado;
    }


/** Obtiene el Esatdo Civil del cliente
 *
 * @return String
 */
    public String getEstadoCivil() {
        return _estadoCivil;
    }


/** Obtiene el nombre del cliente
 *
 * @return String
 */
    public String getNombre() {
        return _nombre;
    }


/** Obtiene el sexo del cliente
 *
 * @return char
 */
    public char getSexo() {
        return _sexo;
    }


/** Obtiene el telefono del cliente
 *
 * @return long
 */
    public long getTelefono() {
        return _telefono;
    }


/** Coloca el apellido del cliente
 *
 * @param _apellido
 */
    public void setApellido(String _apellido) {
        this._apellido = _apellido;
    }


/** Coloca la calle del cliente
 *
 * @param _calle
 */
    public void setCalle(String _calle) {
        this._calle = _calle;
    }


/** Coloca la CI del cliente
 *
 * @param _ciRif
 */
    public void setCiRif(int _ciRif) {
        this._ciRif = _ciRif;
    }


/** Coloca el Estado de ubicacion del cliente
 *
 * @param _estado
 */
    public void setEstado(String _estado) {
        this._estado = _estado;
    }


/** Coloca el Estado civil del cliente
 *
 * @param _estadoCivil
 */
    public void setEstadoCivil(String _estadoCivil) {
        this._estadoCivil = _estadoCivil;
    }


/** Coloca el nombre del cliente
 *
 * @param _nombre
 */
    public void setNombre(String _nombre) {
        this._nombre = _nombre;
    }


/** Coloca el sexo del cliente
 *
 * @param _sexo
 */
    public void setSexo(char _sexo) {
        this._sexo = _sexo;
    }


/** Coloca el telefono del cliente
 * 
 * @param _telefono
 */
    public void setTelefono(long _telefono) {
        this._telefono = _telefono;
    }

    
}
